import 'reflect-metadata'


// function Injectable(target) {}
// @Injectable
// class MyClass {
// }
// // 如果类没有写构造函数 则 `design:paramtypes` 元数据的值是 `undefined`
// console.log('MyClass', Reflect.getMetadata('design:paramtypes', MyClass))


// class MyClass {
//   constructor(){}
// }
// // 如果类没有使用类装饰器 则 `design:paramtypes` 元数据的值是 `undefined`
// console.log('MyClass', Reflect.getMetadata('design:paramtypes', MyClass))


// class MyClass {
//   hello(a: string, b: string): string {
//     return a + b
//   }

//   get a() {
//     return 1
//   }

//   static b(xx: boolean) {}
// }
// // 如果没有使用方法装饰器或访问器装饰器 则 design:paramtypes 元数据的值是 undefined
// console.log('MyClass', Reflect.getMetadata('design:paramtypes', MyClass.prototype, 'hello')) // undefined
// console.log('MyClass', Reflect.getMetadata('design:paramtypes', MyClass.prototype, 'a')) // undefined
// console.log('MyClass', Reflect.getMetadata('design:paramtypes', MyClass, 'b')) // undefined


// function InjectableFN(target, ken, descriptor) { }
// class MyClass {
//   @InjectableFN
//   hello(a: string, b: string): string {
//     return a + b
//   }

//   @InjectableFN
//   get a() {
//     return 1
//   }

//   @InjectableFN
//   static b(xx: boolean) {}
// }
// console.log('MyClass', Reflect.getMetadata('design:paramtypes', MyClass.prototype, 'hello')) // MyClass [ [Function: String], [Function: String] ]
// console.log('MyClass', Reflect.getMetadata('design:paramtypes', MyClass.prototype, 'a')) // MyClass []
// console.log('MyClass', Reflect.getMetadata('design:paramtypes', MyClass, 'b')) // MyClass [ [Function: Boolean] ]


// class MyClass {
//   hello() {

//   }

//   static b() {

//   }
// }
// console.log('MyClass', Reflect.getMetadata('design:returntype', MyClass.prototype, 'hello')) // MyClass undefined
// console.log('MyClass', Reflect.getMetadata('design:returntype', MyClass, 'b')) // MyClass undefined



// function Injectable(target, key, descriptor) {}
// class MyClass {
//   @Injectable
//   hello() {
//     return 1
//   }

//   @Injectable
//   static b() {
//     return 'b'
//   }
// }
// console.log('MyClass', Reflect.getMetadata('design:returntype', MyClass.prototype, 'hello'))
// console.log('MyClass', Reflect.getMetadata('design:returntype', MyClass, 'b'))


function Injectable(target, key, descriptor) {}
class MyClass {
  @Injectable
  hello(): number {
    return 1
  }

  @Injectable
  static b(): string {
    return 'b'
  }
}
console.log('MyClass', Reflect.getMetadata('design:returntype', MyClass.prototype, 'hello')) // MyClass [Function: Number]
console.log('MyClass', Reflect.getMetadata('design:returntype', MyClass, 'b')) // MyClass [Function: String]